﻿/*
SINACOR - BMF&Bovespa
Arquivo: CadastroBloqueio.cs
Criado em: 10-jun-2010 10:23:22
Arquiteto Responsável: p-wgeneroso
*/
using System;
using System.Collections.Generic;
using System.Text;
using System.Linq;
using Sinacor.Infra.Common;
using Sinacor.Infra.UI.Common;
using Sinacor.Infra.Common.Exceptions;


namespace Sinacor.UI.Bovespa.ManutencaoOrdens.Presenter 
{
	public class CadastroBloqueio : BasePresenter<ICadastroBloqueio>
	{
		#region Atributos
		private Communication.ConsultaAssessor _communicationAssessor;
		private Communication.Bloqueio _communicationBloqueio;
		private Communication.Cliente _communicationCliente;
		private Communication.GrupoAfinidade _communicationGrupoAfinidade;
		private Communication.Mercado _communicationMercado;
		private Communication.TipoCliente _communicationTipoCliente;
		private Communication.Titulo _communicationTitulo;
        private Communication.ControleMovimentoOrdens _communicationControleMovimentoOrdens;
		private Model.Parameter.FiltroBloqueio _filtroBloqueio;
		private ModelCollection<Model.Assessor> _listaAssessores;
		private ModelCollection<Model.Bloqueio> _listaBloqueios;
		private ModelCollection<Model.GrupoAfinidade> _listaGruposAfinidades;
		private ModelCollection<Model.Mercado> _listaMercados;
		private ModelCollection<Model.TipoCliente> _listaTiposClientes;
        private Model.InformacoesMovimento _informacoesMovimento;
		#endregion

		#region Propriedades

        public Model.Cliente ClienteAtual { get; set; }

        public Model.InformacoesMovimento InformacoesMovimento
        {
            get { return _informacoesMovimento; }
            set { _informacoesMovimento = value; }
        }

		public Model.Parameter.FiltroBloqueio FiltroBloqueio
		{
			get { return _filtroBloqueio; }
			set { _filtroBloqueio = value; }
		}

		public ModelCollection<Model.Assessor> ListaAssessores
		{
			get { return _listaAssessores; }
			set { _listaAssessores = value; }
		}

		public ModelCollection<Model.Bloqueio> ListaBloqueios
		{
			get { return _listaBloqueios; }
			set { _listaBloqueios = value; }
		}

		public ModelCollection<Model.GrupoAfinidade> ListaGruposAfinidades
		{
			get { return _listaGruposAfinidades; }
			set { _listaGruposAfinidades = value; }
		}

		public ModelCollection<Model.Mercado> ListaMercados
		{
			get { return _listaMercados; }
			set { _listaMercados = value; }
		}

		public ModelCollection<Model.TipoCliente> ListaTiposClientes
		{
			get { return _listaTiposClientes; }
			set { _listaTiposClientes = value; }
		}
		#endregion

        #region Construtor

        public CadastroBloqueio(ICadastroBloqueio view)
            : base(view)
        {
            _communicationAssessor = new Sinacor.UI.Bovespa.ManutencaoOrdens.Communication.ConsultaAssessor(this.Session);
            _communicationBloqueio = new Sinacor.UI.Bovespa.ManutencaoOrdens.Communication.Bloqueio(this.Session);
	        _communicationCliente = new Sinacor.UI.Bovespa.ManutencaoOrdens.Communication.Cliente(this.Session);
	        _communicationGrupoAfinidade = new Sinacor.UI.Bovespa.ManutencaoOrdens.Communication.GrupoAfinidade(this.Session);
	        _communicationMercado = new Sinacor.UI.Bovespa.ManutencaoOrdens.Communication.Mercado(this.Session);
	        _communicationTipoCliente = new Sinacor.UI.Bovespa.ManutencaoOrdens.Communication.TipoCliente(this.Session);
	        _communicationTitulo = new Sinacor.UI.Bovespa.ManutencaoOrdens.Communication.Titulo(this.Session);
            _communicationControleMovimentoOrdens = new Sinacor.UI.Bovespa.ManutencaoOrdens.Communication.ControleMovimentoOrdens(this.Session);

            _filtroBloqueio = new Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Parameter.FiltroBloqueio();
            _filtroBloqueio.Assessor = new Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Assessor();
            _filtroBloqueio.GrupoAfinidade = new Sinacor.UI.Bovespa.ManutencaoOrdens.Model.GrupoAfinidade { Codigo = -1 };
            _filtroBloqueio.Mercado = new Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Mercado();
            _filtroBloqueio.TipoCliente = new Sinacor.UI.Bovespa.ManutencaoOrdens.Model.TipoCliente();
            _listaBloqueios = new ModelCollection<Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Bloqueio>();
        }

        #endregion

        #region Métodos
        
        /// <summary>
        /// Alterar Bloqueio
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
		public bool AlterarBloqueio(Model.Bloqueio model)
		{
            try
            {
                this._communicationBloqueio.AlterarBloqueio(model);
                View.InformarSucessoOperacao();

                return true;
            }
            catch (Exception ex)
            {
                this.HandleException(ex);

                return false;
            }
		}

        /// <summary>
        /// Consultar Bloqueios
        /// </summary>
		public void ConsultarBloqueios()
		{
            try
            {
                this.ListaBloqueios = _communicationBloqueio.ConsultarBloqueios(this.FiltroBloqueio);

                if (this.ListaBloqueios == null || this.ListaBloqueios.Count == 0)
                    View.InformarPesquisaSemResultado();

                PrepararListaBloqueios();

                View.AtualizarListaBloqueios();
            }
            catch (Exception ex)
            {
                this.HandleException(ex);
            }
		}

        private void PrepararListaBloqueios()
        {
            if (this.ListaBloqueios != null && this.ListaBloqueios.Count > 0)
            {
                foreach (Model.Bloqueio bloqueio in this.ListaBloqueios)
                {
                    if (bloqueio.Assessor != null && bloqueio.Assessor.Codigo > 0)
                        bloqueio.Assessor.Nome = (from assessor in this.ListaAssessores
                                                  where assessor.Codigo == bloqueio.Assessor.Codigo
                                                  select assessor).First().Nome;

                    if (bloqueio.GrupoAfinidade != null && bloqueio.GrupoAfinidade.Codigo >= 0)
                        bloqueio.GrupoAfinidade.Descricao = (from grupoAfinidade in this.ListaGruposAfinidades
                                                             where grupoAfinidade.Codigo == bloqueio.GrupoAfinidade.Codigo
                                                             select grupoAfinidade).First().Descricao;

                    if (bloqueio.Mercado != null && bloqueio.Mercado.Codigo > 0)
                        bloqueio.Mercado.Descricao = (from mercado in this.ListaMercados
                                                      where mercado.Codigo == bloqueio.Mercado.Codigo
                                                      select mercado).First().Descricao;

                    if (bloqueio.TipoCliente != null && bloqueio.TipoCliente.Codigo > 0)
                        bloqueio.TipoCliente.Descricao = (from tipoCliente in this.ListaTiposClientes
                                                          where tipoCliente.Codigo == bloqueio.TipoCliente.Codigo
                                                          select tipoCliente).First().Descricao;
                }
            }
        }
		/// <summary>
        /// Excluir Bloqueio
		/// </summary>
		/// <param name="model"></param>
		/// <returns></returns>
		public bool ExcluirBloqueio(Model.Bloqueio model)
		{
            try
            {
                if (model != null)
                {
                    Model.Parameter.FiltroBloqueioChave filtro = new Model.Parameter.FiltroBloqueioChave
                    {
                        Codigo = model.Codigo
                    };

                    if (View.ConfimarExclusaoBloqueio())
                    {
                        _communicationBloqueio.ExcluirBloqueio(filtro);

                        View.InformarSucessoOperacao();
                    }
                }

                return true;
            }
            catch (Exception ex)
            {
                this.HandleException(ex);
                return false;
            }
		}

		/// <summary>
        /// Incluir Bloqueio
		/// </summary>
		/// <param name="model"></param>
		/// <returns></returns>
		public bool IncluirBloqueio(Model.Bloqueio model)
		{
            try
            {
                _communicationBloqueio.IncluirBloqueio(model);
                View.InformarSucessoOperacao();

                return true;
            }
            catch (Exception ex)
            {
                this.HandleException(ex);
                return false;
            }
		}

        /// <summary>
        /// Inicializar
        /// </summary>
		public void Inicializar()
		{
            try
            {
                //Consultar informações do movimento
                _informacoesMovimento = this._communicationControleMovimentoOrdens.ObterInformacoesMovimento(new Model.DataMovimento());
                
                //Consultar Assessores
                _listaAssessores = this._communicationAssessor.ConsultarAssessores(new Model.Parameter.FiltroConsultaAssessor());

                //Consultar Grupos Afinidades
                _listaGruposAfinidades = this._communicationGrupoAfinidade.ConsultarGruposAfinidades(new Model.Parameter.FiltroGrupoAfinidade());

                //Consultar Mercados
                _listaMercados = this._communicationMercado.ConsultarMercados();

                //Consultar Tipos Clientes
                _listaTiposClientes = this._communicationTipoCliente.ConsultarTiposClientes(new Model.Parameter.FiltroTipoCliente());

                //Atualiza listas
                View.AtualizarListas();
            }
            catch (Exception ex)
            {
                this.HandleException(ex);
            }
		}

        /// <summary>
        /// Verificar Cliente
        /// </summary>
		public void VerificarCliente(string apelido)
		{
            this.ClienteAtual = null;

            try
            {
                if (this.FiltroBloqueio != null)
                {
                    Model.Parameter.FiltroCliente filtro = new Model.Parameter.FiltroCliente
                    {
                        Apelido = apelido
                    };

                    this.ClienteAtual = _communicationCliente.ObterCliente(filtro);

                    //if (resultado == null)
                    //    View.InformarClienteNaoEncontrado();
                }
            }
            catch (Exception ex)
            {
                this.HandleException(ex);
            }
		}

        /// <summary>
        /// Verificar Titulo
        /// </summary>
		public void VerificarTitulo()
		{
            Model.Titulo resultado = null;

            try
            {
                if (this.FiltroBloqueio != null && this._informacoesMovimento != null)
                {
                    Model.Parameter.FiltroTitulo filtro = new Model.Parameter.FiltroTitulo
                    {
                        CodigoNegocio = this.FiltroBloqueio.Ativo,
                        DataPregao = this._informacoesMovimento.DataMovimento
                    };

                    resultado = _communicationTitulo.ObterTitulo(filtro);

                    if (resultado == null)
                        View.InformarTituloNaoCadastrado();
                }
            }
            catch (Exception ex)
            {
                this.HandleException(ex);
            }

		}

        public void AtualizarEstadoTipoBloqueio(Model.Enum.TipoBloqueio tipoBloqueio)
        {
            switch (tipoBloqueio)
            { 
                case Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Enum.TipoBloqueio.Cliente:
                    View.AlterarEstadoBloqueioAssessor(false);
                    View.AlterarEstadoBloqueioAtivo(true);
                    View.AlterarEstadoBloqueioCliente(true);
                    View.AlterarEstadoBloqueioGrupoAfinidade(false);
                    View.AlterarEstadoBloqueioMercado(true);
                    View.AlterarEstadoBloqueioTipoCliente(false);
                    break;
                case Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Enum.TipoBloqueio.Assessor:
                    View.AlterarEstadoBloqueioAssessor(true);
                    View.AlterarEstadoBloqueioAtivo(true);
                    View.AlterarEstadoBloqueioCliente(false);
                    View.AlterarEstadoBloqueioGrupoAfinidade(false);
                    View.AlterarEstadoBloqueioMercado(true);
                    View.AlterarEstadoBloqueioTipoCliente(false);
                    break;
                case Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Enum.TipoBloqueio.GrupoAfinidade:
                    View.AlterarEstadoBloqueioAssessor(false);
                    View.AlterarEstadoBloqueioAtivo(true);
                    View.AlterarEstadoBloqueioCliente(false);
                    View.AlterarEstadoBloqueioGrupoAfinidade(true);
                    View.AlterarEstadoBloqueioMercado(true);
                    View.AlterarEstadoBloqueioTipoCliente(false);
                    break;
                case Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Enum.TipoBloqueio.TipoCliente:
                    View.AlterarEstadoBloqueioAssessor(false);
                    View.AlterarEstadoBloqueioAtivo(true);
                    View.AlterarEstadoBloqueioCliente(false);
                    View.AlterarEstadoBloqueioGrupoAfinidade(false);
                    View.AlterarEstadoBloqueioMercado(true);
                    View.AlterarEstadoBloqueioTipoCliente(true);
                    break;
                case Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Enum.TipoBloqueio.Mercado:
                case Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Enum.TipoBloqueio.Papel: 
                    View.AlterarEstadoBloqueioAssessor(false);
                    View.AlterarEstadoBloqueioAtivo(true);
                    View.AlterarEstadoBloqueioCliente(false);
                    View.AlterarEstadoBloqueioGrupoAfinidade(false);
                    View.AlterarEstadoBloqueioMercado(true);
                    View.AlterarEstadoBloqueioTipoCliente(false);
                    break;
                
            }
        }
		#endregion
	}
}